package model.observer;

import commands.Command;

import model.value.VersionnedValue;

import model.subject.Sensor;

/**
 * Implémentation de l'interface SensorObserver.
 */
public class Displayer implements SensorObserver {

	private VersionnedValue value;
	
	private Command notifyChangesToDisplayerPanelCommand;
	
	@Override
	public void update(Sensor sensor) {
		// On détache un thread pour aller récupérer la valeur afin que l'observeur puisse éventuellement faire autre chose en attendant
		Thread thread = new Thread(new AsynchronousGetValue(sensor));
		thread.start();
	}

	@Override
	public void setNotifyChangesToDisplayerPanelCommand(Command notifyChangesToDisplayerPanelCommand) {
		this.notifyChangesToDisplayerPanelCommand = notifyChangesToDisplayerPanelCommand;
	}
	
	@Override
	public VersionnedValue getValue() {
		return value;
	}
	
	class AsynchronousGetValue implements Runnable {

		private Sensor sensor;
		
		public AsynchronousGetValue(Sensor sensor) {
			this.sensor = sensor;
		}
		
		@Override
		public void run() {
			value = this.sensor.getValue();
			notifyChangesToDisplayerPanelCommand.execute();
		}
		
	}
	
}
